package com.kaikeba.service;

import com.kaikeba.bean.Express;
import com.kaikeba.dao.BaseExpressDao;
import com.kaikeba.dao.impl.ExpressDaoMysql;
import com.kaikeba.exception.DuplicateCodeException;
import com.kaikeba.util.RandomUtil;
import com.kaikeba.util.SMSUtil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: 平川
 * @Description:
 * @Date Created in 2021-07-30 14:27
 * @Modified By:
 */
public class ExpressService  {
    private static  BaseExpressDao dao = new ExpressDaoMysql();

    public static List<Map<String, Integer>> console() {
        return dao.console();
    }

    /**
     * 用于查询所有快递
     *
     * @param limit
     * @param offset
     * @param pageNumber
     * @param: limit: true:分页查询  false:查询全部
     * @param: offset:起始位置
     * @param: pageNumber:查询条数
     * @return: 查询到快递的集合
     */

    public static List<Express> findAll(boolean limit, int offset, int pageNumber) {
        return dao.findAll(limit,offset,pageNumber);
    }

    /**
     * 根据取件码查询快递信息
     *
     * @param code 取件码
     * @return 不存在时返回空
     */

    public static Express findByCode(String code) {
        return dao.findByCode(code);
    }

    /**
     * 根据用户单号查询快递信息
     *
     * @param number 单号
     * @return 不存在时返回空
     */

    public static Express findByNumber(String number) {
        return dao.findByNumber(number);
    }

    /**
     * 根据用户手机号查询快递信息
     *
     * @param userPhone 手机号
     * @return 不存在时返回空
     */

    public static List<Express> findByUserPhone(String userPhone) {
        return dao.findByUserPhone(userPhone);
    }

    /**
     * 根据用户手机号查询未取件的快递信息
     * @param userPhone 手机号
     * @return  不存在时返回空
     */
    public static List<Express> findByUserPhoneAndStatus(String userPhone,int status){
     return dao.findByUserPhoneAndStatus(userPhone,status);
    }
    /**
     * 根据录入人查询快递信息
     *
     * @param sysPhone 录入人
     * @return 不存在时返回空
     */

    public static List<Express> findBySysPhone(String sysPhone) {
        return dao.findBySysPhone(sysPhone);
    }

    /**
     * 快递的录入
     *
     * @param e@return 录入结果
     */

    public static boolean insert(Express e)  {
        //1.生成取件码
        e.setCode(RandomUtil.getCode()+"");
        try {
            boolean flag = dao.insert(e);
            if (flag){
                //录入成功,因为不能发短信所以就不用他了，否则就插入不进去了
                //SMSUtil.send(e.getUserphone(),e.getCode());
            }
            return flag;
        } catch (DuplicateCodeException duplicateCodeException) {
            return insert(e);
        }
    }

    /**
     * 快递的修改
     * @param id         快递的id
     * @param newExpress 新的快递的对象（number,company,username,phoneNumber）
     * @return 修改的结果
     */

    public static boolean update(int id, Express newExpress) {
        if (newExpress.getUserphone()!=null){
            dao.delete(id);
            return insert(newExpress);
        }else{
            boolean update1 = dao.update(id, newExpress);
            Express e = findByNumber(newExpress.getNumber());
            String code = e.getCode();
            if (newExpress.getStatus()==1){
                updateStatus(code);
            }
            return update1;
        }
    }

    /**
     * 更改快递的状态为1，表示取件完成
     *
     * @param code 取件码
     * @return 修改的结果 true表示成功， false表示失败
     */

    public static boolean updateStatus(String code) {
        return dao.updateStatus(code);
    }

    /**
     * 根据手机号去修改， 用户名与 手机号码
     */
    public static boolean updateUsernameUserphone(int id,String username,String userphone){
        return dao.updateUsernameUserphone(id,username,userphone);
    }


    /**
     * 删除快递
     *
     * @param id 快递id
     * @return true成功 false 失败
     */

    public static boolean delete(int id) {
        return dao.delete(id);
    }

    /**
     * 根据手机号，返回用户的昵称，与未取件数量
     */
    public static List<Map<String,Object>> returnUsernameCount(){
        List<Map<String, Object>> list1 = new ArrayList<>();
        List<String> list = dao.findbyStatus(0); //获取手机号

        for (String userphone: list){

            String username = dao.findbyUserphone(userphone); //获取姓名
            int count = dao.findbyUserphoneAndStatus(userphone, 0); //获取数量
            Map<String, Object> map = new HashMap<>();
            map.put("username",username);
            map.put("count",count);
            list1.add(map);
        }
        return list1;
    }
}
